﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SonarSnitch.Business.Entity
{
    public class AvaliacaoGrupo : SonarSnitch.Business.Entity.IAvaliacao 
    {
        public AvaliacaoGrupo(IList<AvaliacaoProjeto> projetosGrupo, string filtro)
        {
            Projetos = projetosGrupo;
            quantidadeProjetos = Projetos.Sum(p => p.Peso);
            Filtro = filtro;
        }

        public string Filtro { get; private set; }

        private float quantidadeProjetos;

        public IList<AvaliacaoProjeto> Projetos { get; set; }

        /// <summary>
        /// Codigo do Projeto
        /// </summary>
        public string Codigo { get { return string.Empty; } }

        /// <summary>
        /// Nome do Projeto
        /// </summary>
        public string Nome { get { return string.Empty; } }

        /// <summary>
        /// Regional
        /// </summary>
        public string Regional
        {
            get
            {
                if (!string.IsNullOrWhiteSpace(this.Filtro)) { return Filtro; }
                if(this.Projetos.FirstOrDefault() != null){
                    return this.Projetos.FirstOrDefault().Regional;
                } else {
                    return string.Empty;
                }
            }
        }

        /// <summary>
        /// Número de Linhas de Código
        /// </summary>
        public float Linhas { get { return Projetos.Sum(p => p.Linhas * p.Peso) / quantidadeProjetos; } }

        /// <summary>
        /// Total Quality
        /// </summary>
        public float Qualidade { get { return Projetos.Sum(p => p.Qualidade * p.Peso) / quantidadeProjetos; } }
        
        /// <summary>
        /// Rules Complain - RCI
        /// </summary>
        public float ConformidadeRegras { get { return Projetos.Sum(p => p.ConformidadeRegras * p.Peso) / quantidadeProjetos; } }
        
        /// <summary>
        /// Cobertura de Testes - Coverage
        /// </summary>
        public float Cobertura { get { return Projetos.Sum(p => p.Cobertura * p.Peso) / quantidadeProjetos; } }

        /// <summary>
        /// % de sucesso dos testes unitários
        /// </summary>
        public float SucessoTestes { get { return Projetos.Sum(p => p.SucessoTestes * p.Peso) / quantidadeProjetos; } }
        
        /// <summary>
        /// Violações de código (com peso)
        /// </summary>
        public float Violacoes { get { return Projetos.Sum(p => p.Violacoes * p.Peso) / quantidadeProjetos; } }

        /// <summary>
        /// Número de violações Blocker
        /// </summary>
        public float ViolacoesBlockerCritical { get { return Projetos.Sum(p => p.ViolacoesBlockerCritical * p.Peso) / quantidadeProjetos; } }

        /// <summary>
        /// Número de violações Blocker
        /// </summary>
        public float ViolacoesBlocker { get { return Projetos.Sum(p => p.ViolacoesBlocker * p.Peso) / quantidadeProjetos; } }

        /// <summary>
        /// Número de Violacoes Critical
        /// </summary>
        public float ViolacoesCritical { get { return Projetos.Sum(p => p.ViolacoesCritical * p.Peso) / quantidadeProjetos; } }

        /// <summary>
        /// Duplicação de Código
        /// </summary>
        public float CodigoDuplicado { get { return Projetos.Sum(p => p.CodigoDuplicado * p.Peso) / quantidadeProjetos; } }

        /// <summary>
        /// Débito Técnico
        /// </summary>
        public float DebitoTecnico { get { return Projetos.Sum(p => p.DebitoTecnico * p.Peso) / quantidadeProjetos; } }

        /// <summary>
        /// Comentários
        /// </summary>
        public float Comentarios { get { return Projetos.Sum(p => p.Comentarios * p.Peso) / quantidadeProjetos; } }

        /// <summary>
        /// Arquitetura do Total Quality
        /// </summary>
        public float Arquitetura { get { return Projetos.Sum(p => p.Arquitetura * p.Peso) / quantidadeProjetos; } }

        /// <summary>
        /// Design do Total Quality
        /// </summary>
        public float Design { get { return Projetos.Sum(p => p.Design * p.Peso) / quantidadeProjetos; } }

        /// <summary>
        /// Total Quality de Testes
        /// </summary>
        public float Testes { get { return Projetos.Sum(p => p.Testes * p.Peso) / quantidadeProjetos; } }

        /// <summary>
        /// Total Quality de Código Fonte
        /// </summary>
        public float Fonte { get { return Projetos.Sum(p => p.Fonte * p.Peso) / quantidadeProjetos; } }

        /// <summary>
        /// Peso
        /// </summary>
        public float Peso { get { return 1; } }

        /// <summary>
        /// Acesso ao projeto no Sonar
        /// </summary>
        public string UriSonar { get { return string.Format("http://sonar.petrobras.com.br/", Codigo); } }
    }
}
